package rsj.service.test;

import com.alibaba.fastjson.JSON;
import com.rlyy.aibase.db.Dbink;
import com.rlyy.aibase.utils.base.MapNode;
import com.rlyy.aibase.utils.base.TableNode;
import com.rlyy.aibase.utils.base.ThinkException;
import common.exec.RsjIllegalArgueException;
import common.util.QueryRunnerFactory;
import common.util.http.UploadFileResponseData;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import rsj.api.product.entity.TestQueryParam;
import rsj.db.PostgresqlConn;
import rsj.service.export.IWriteUploadFileMethod;

import java.io.OutputStream;
import java.sql.Connection;

/**
 * @author yuanqinglong
 * @since 2021/3/17 17:36
 */
public interface ITestExportTemplateMethod extends IWriteUploadFileMethod {

    Logger logger = LoggerFactory.getLogger(ITestExportTemplateMethod.class);

    /**
     * 执行导出、下载方法
     *
     * @param testQueryParam 请求参数
     * @return 返回结果
     */
    default MapNode performExport(TestQueryParam testQueryParam) {
        UploadFileResponseData fileResponseData;
        Connection connection = PostgresqlConn.getConnection();
        try {
            TableNode tableNode = QueryRunnerFactory.getQueryRunner().queryLinkTableNode(connection, this.generateQueryStatement(testQueryParam));
            // 根据业务情况 二次处理数据预留接口 默认是空方法
            String jsonData = this.processDataAccordingToTheSituation(tableNode, connection, testQueryParam);
            // 将查询的数据写入到文件输出流
            OutputStream outputStream = this.writeDataToTheOutputStream(jsonData, null);
            // 将文件上传到文件服务器 返回文件id
            fileResponseData = this.uploadToFileService(outputStream, this.generateExportFileName(testQueryParam));
        } catch (ThinkException e) {
            logger.error("导出、下载文件失败！参数：{}", JSON.toJSONString(testQueryParam), e);
            throw new RsjIllegalArgueException("导出、下载文件失败！");
        } finally {
            Dbink.close(connection);
        }
        return new MapNode().putNode("File_Id", fileResponseData.getFileId()).putNode("File_Name", fileResponseData.getFileName());
    }


    /**
     * 生成查询语句
     *
     * @param testQueryParam 参数
     * @return sql
     */
    String generateQueryStatement(TestQueryParam testQueryParam);


    /**
     * 生成导出的文件名称
     *
     * @param testQueryParam 参数
     * @return 文件名
     */
    String generateExportFileName(TestQueryParam testQueryParam);


    /**
     * 提供扩展的默认方法-根据不同业务情况重写此方法二次处理列表数据
     *
     * @param tableNode        列表数据
     * @param connection       数据库连接
     * @param testQueryParam usageReportParam参数
     * @return 处理后的列表数据
     */
    default String processDataAccordingToTheSituation(TableNode tableNode, Connection connection, TestQueryParam testQueryParam) {
        return tableNode.toJson();
    }
}
